序言
RP2040 (Raspberry Pi Pico) 拥有双核 Cortex-M0+ 架构和独特的 PIO 状态机。在进行 Rust 嵌入式开发时,我们需要一套稳定可靠的烧录与调试方案。
虽然官方提供了基于 USB 存储模拟的 UF2 拖拽烧录方式,但在实际开发中,我们需要断点调试、RTT 日志输出以及一键自动烧录。本文整合了从最基础的软件工具到进阶的硬件调试方案。
第一部分:软件烧录工具 (文件传输)
这部分介绍运行在电脑端的纯软件工具,它们主要用于将编译好的固件(UF2/ELF)传输给 RP2040,通常利用 BootROM 或 USB 协议,不涉及硬件调试器。
原理:利用 RP2040 BootROM 中的固化程序,模拟 USB 大容量存储设备。
操作:
- 按住板上的
BOOTSEL键插入 USB。 - 电脑识别出
RPI-RP2磁盘。 - 将
.uf2文件拖入即可。
评价
无需任何软件,适合发布固件,但不适合频繁开发调试。
工具:elf2uf2-rs
功能:Rust 专用工具,自动将 ELF 转为 UF2 并搜索 Pico 磁盘烧录。
安装方式:
cargo install elf2uf2-rs配置:
# .cargo/config.toml
[target.thumbv6m-none-eabi]
runner = "elf2uf2-rs --deploy --serial --verbose"工具:picotool (官方 CLI)
功能:
- 查看已连接设备:
picotool info -a - 烧录 UF2/ELF/BIN:
picotool load my_firmware.uf2 - 强行进入刷机模式:
picotool load -f my_firmware.uf2(需要原固件中启用了 USB stdio 且未死机) - 重启设备:
picotool reboot
获取:随 Pico SDK 安装或通过包管理器(如 brew)安装。
第二部分:调试运行器 (Debug Runners)
这部分软件运行在电脑端,充当桥梁角色。它们连接 USB 硬件调试器(如 Picoprobe, DAPLink),并向上层提供调试服务(GDB, RTT)。
工具:probe-rs
特点: Rust 嵌入式开发的现代标准工具,无需安装 OpenOCD。它内置了对 CMSIS-DAP、ST-Link 等协议的支持,可以直接与硬件调试器通信,实现烧录、复位、RTT 日志读取。
安装方式:
cargo install probe-rs-tools常用命令:
# 自动寻找连接的调试器,烧录并运行,同时输出 RTT 日志
probe-rs run --chip RP2040 <BIN FILE>配置: 在 .cargo/config.toml 中设置 runner,即可实现 cargo run 一键调试:
[target.thumbv6m-none-eabi]
runner = "probe-rs run --chip RP2040"工具:OpenOCD
特点: 历史悠久,兼容性极广。对于某些特殊的调试固件(如 pico-debug),probe-rs 目前存在兼容性问题,此时必须使用 OpenOCD 作为后端。
典型用法: 开启一个后台进程连接调试器,然后 GDB 或 IDE 连接到 OpenOCD 的端口(通常是 3333)进行调试。
openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg第三部分:硬件调试方案
这部分解决 “用什么硬件连接 RP2040 SWD 接口” 的问题。RP2040 使用 Multi-drop SWD 协议,部分老旧调试器可能不兼容。
使用第二块 Pico 作为专用调试器,或者购买官方的 Raspberry Pi Debug Probe。这是官方推荐且最稳定的方案。
1. 固件选型说明
| 固件文件 | 对应硬件 | 核心 MCU | 选型依据 |
|---|---|---|---|
debugprobe.uf2 | Raspberry Pi Debug Probe | RP2040 | 专为官方调试探针硬件设计,适配其内置电平转换电路和专属引脚布局。 |
debugprobe_on_pico.uf2 | Raspberry Pi Pico | RP2040 | 最常用。用于将闲置 Pico 刷成调试探针,复用 Pico 原生引脚。 |
debugprobe_on_pico2.uf2 | Raspberry Pi Pico 2 | RP2350 | 适配 Pico 2 硬件,保持与 Pico 的引脚兼容性。 |
2. 引脚定义 (以 Pico 为例)
使用 debugprobe_on_pico.uf2 固件时:
| 功能 | GPIO 引脚 | 说明 |
|---|---|---|
| SWCLK (时钟) | GPIO 2 | 连接到目标板的 SWCLK |
| SWDIO (数据) | GPIO 3 | 连接到目标板的 SWDIO |
| GND | GND | 必须共地 |
| UART TX | GPIO 4 | (可选) 连接到目标板的 RX |
| UART RX | GPIO 5 | (可选) 连接到目标板的 TX |
| LED | GPIO 25 | 指示工作状态 |
注意
官方成品 Debug Probe 的引脚定义不同(SWCLK=GP12, SWDIO=GP14),请务必根据硬件下载对应固件。
如果你手头只有一块 Pico,可以让它利用自身的一个核心来调试另一个核心。
- 资源仓库:majbthrd/pico-debug
- 原理:固件运行在 RAM 中,模拟成 CMSIS-DAP 接口。
- 适用软件:必须配合 OpenOCD 使用。目前
probe-rs对该方案支持不佳。
固件版本选择:
推荐:pico-debug-gimmecache.uf2
- 特点:保留 Flash 缓存 (XIP),保留 248KB (94%) SRAM 给用户程序。
- 理由:性能影响最小,适合绝大多数场景。
备选:pico-debug-maxram.uf2
- 特点:提供完整的 264KB SRAM。
- 缺点:占用了 Flash 缓存,会导致用户代码运行变慢,仅在急需内存时使用。
提示
随着时间推移,直接购买原装 STM32F103 的 ST-Link 越来越难,很多廉价克隆版可能导致兼容性问题。 使用通用的 STM32F103 开发板(BluePill)或兼容的 ST-Link V2 Dongle 配合 dap42 固件是高性价比选择。
- 资源仓库:devanlai/dap42
1. 固件文件说明
| 文件名 | 说明 |
|---|---|
DAP103-dapboot-combined-stlink.bin | 新手推荐。适用于 ST-Link V2 硬件,集成 Bootloader,一步到位。 |
DAP42.bin / DAP42DC.bin | 适用于 BluePill 开发板 (PA9/PA10 USB)。 |
DAP103-HID-*.bin | HID 版本,免驱兼容性更好,无需 WinUSB 驱动。 |
DAP103-DFU-*.bin | 带有 DFU 功能的版本,方便后续通过 USB 升级。 |
DAP103-stlink.bin | 纯固件,需自行处理 Bootloader。 |
BRAINv3.3.bin | 适用于 Brain V3.3 硬件。 |
2. 烧录指南 (救砖模式)
如果你手头有另一个调试器(如另一块 DAPLink 或 ST-Link),可以使用 probe-rs 将固件刷入你的 ST-Link Dongle:
# 警告:请确保你了解硬件连接,错误操作可能导致设备变砖 (需要飞线连接内部 SWD 接口)
probe-rs download --chip stm32f103c8 --protocol swd --binary-format bin --base-address 0x08000000 .\DAP103-dapboot-combined-stlink.bin- 替代方案:使用
dfu-util(需设备处于 DFU 模式,且有一定风险)。
3. 引脚定义 (刷入 dap42 后)
| 信号 | 引脚 | 说明 |
|---|---|---|
| SWDIO | PB14 | 对应原 ST-Link 的 SWDIO |
| SWCLK | PB13 | 对应原 ST-Link 的 SWCLK |
| RESET | PB0 | 复位引脚 |
| TX | PA2 | 虚拟串口发送 |
| RX | PA3 | 虚拟串口接收 |
除了上述方案,还有许多开源硬件 / 固件支持 RP2040 调试:
补充阅读:其他调试方案
1. Black Magic Probe (GDB Server)
如果不想用 OpenOCD,可以将 ST-Link 刷成 Black Magic Probe (BMP) 固件。它内置了 GDB Server,可以直接用 GDB 连接,无需中间件。
点击展开:刷写与使用教程
1. 准备工作
- 硬件:ST-Link V2
- 仓库:arendjan/stlink_rp2040
**2. 刷入固件 **
- 见
方案 C:ST-Link V2 Clone (dap42)步骤相同。
3. 硬件接线
- SWCLK -> RP2040 SWCLK
- SWDIO -> RP2040 SWDIO
- GND -> GND
4. GDB 调试
- 查找 COM 端口:较小编号的为 GDB 接口,较大编号的为 UART。
- 启动 GDB 并连接:bash
arm-none-eabi-gdb your_firmware.elf - GDB 内部执行:gdb
target extended-remote \\.\COM10 # 替换实际端口 monitor swdp_scan # 扫描 SWD 设备 attach 1 # 连接第一个设备 load # 烧录 run # 运行
2. J-Link 调试
J-Link 配合 OpenOCD 调试 RP2040 需要进行驱动替换(Zadig -> WinUSB)等繁琐配置。除非手头只有 J-Link,否则不建议作为首选方案。
参考教程
详细配置步骤请参考:Raspberry Pi Pico SWD with J-Link